package com.spring.format.code.generation.util.file;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import com.spring.format.code.generation.constants.FileNameEnumType;
import com.spring.format.code.generation.mybatis.po.TablePO;
import com.spring.format.code.generation.mybatis.vo.CreateFileVO;
import com.spring.format.code.generation.mybatis.vo.JavaAttributeVO;
import com.spring.format.code.generation.util.FieldUtil;
import com.spring.format.code.generation.util.ImportClassUtil;
import com.spring.format.code.generation.util.NameUtil;
import com.spring.format.code.generation.util.PathUtil;

/**
 * 文件生成帮助类 现在的 vo与po相似，只是说明不同
 * 
 * @author lenovo
 *
 */
public class CommonFormFileUtil {
	
	private CommonFormFileUtil(){
		
	}
	public static String content(CreateFileVO fileVO) {

		TablePO tablePO = fileVO.getTablePO();
		List<JavaAttributeVO> attrVOList = fileVO.getAttrVOList();
		// 需要引入的类，类型的临时存储集合
		Set<String> hasImport = new HashSet<>();

		StringBuilder importStr = new StringBuilder();
		/** package, import 部分 **/
		importStr.append(packageAndImport(tablePO));
		
		StringBuilder attribute = new StringBuilder();
		//文件BaseVO 部分
		attribute.append(classHead(tablePO));

		StringBuilder methodStr = new StringBuilder();
		for (JavaAttributeVO attrVO : attrVOList) {
			// 根据 数据类型，引入类
			String importTemp = ImportClassUtil.importJavaPath(attrVO);
			// 没有被引入过，引入。比如Date有的类里面有多个Date字段，只需引入一次
			if (StringUtils.isNotBlank(importTemp) && !hasImport.contains(importTemp)) {
				importStr.append(importTemp);
				// 放入已经引入的结果集合
				hasImport.add(importTemp);
			}
			String[] importArray = FieldUtil.importFieldVO(attrVO);
			if (null != importArray) {
				attribute.append(importArray[0]);
				methodStr.append(importArray[1]);
			}

		}
		attribute.append(" \n\n");


		// po的类名
		String poName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.PO_NAME);
		// vo的类名
		String formName = NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.FORM_NAME);
		// 拼接get，set方法
		attribute.append(methodStr)
				// 加入 po 转vo 构造方法
				.append(constructure(formName, poName,tablePO,attrVOList))
				// 加入 vo 转po 方法
				.append(convertToPO(poName))
				// 加入 新增验证
				//.append(addValidate(formName))
				// 加入更新验证
				//.append(updateValidate(formName))
				//toString 方法
				.append(toString(formName))
				//类结束
				.append("} //end class");
		// 拼接为返回str
		StringBuilder resultStr = new StringBuilder();
		resultStr.append(importStr).append(attribute);

		return resultStr.toString();

	}
	/** 文件包，引入类部分 **/
	public static String packageAndImport(TablePO tablePO) {
		StringBuilder importStr = new StringBuilder();
		importStr.append("package ")
		.append(PathUtil.createPackagePath(tablePO.getTable_name(), FileNameEnumType.FORM_NAME)).append(" \n")
		.append("import io.swagger.annotations.ApiModel; \n")
		.append("import io.swagger.annotations.ApiModelProperty; \n").append("import java.io.Serializable; \n")
		.append("import com.sx.common.util.json.JackJsonUtil; \n")
		.append("import com.fasterxml.jackson.annotation.JsonInclude; \n ");
		return importStr.toString();
	}
	public static String classHead(TablePO tablePO) {
		StringBuilder attribute = new StringBuilder();
		attribute.append("/**\n").append("  *").append(tablePO.getTable_comment()).append("\n").append("  *@author ")
		.append(System.getProperties().getProperty("user.name")).append("\n").append("  *@version 1.0.0 ")
		.append(DateUtil.dateToStr(new Date())).append(" \n").append("  */\n")
		.append("  @ApiModel(description = \"").append(tablePO.getTable_comment()).append("\") \n")
		.append("public class ")
		.append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.FORM_NAME))
		.append(" extends BaseForm implements Serializable { \n").append("	 /** 序列化 */\n")
		.append("	 private static final long serialVersionUID = ").append(System.currentTimeMillis())
		.append("L;\n");
		return attribute.toString();
	}


	public static String constructure(String formName, String poName,TablePO tablePO,List<JavaAttributeVO> attrVOList) {
		StringBuilder str = new StringBuilder();
		/** 构造方法 **/
		str.append("	public ").append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.FORM_NAME))
				.append("(){ \n").append("		super() ; \n").append("	} \n");
		/** 构造方法 **/
		str.append("	public ").append(NameUtil.createFileName(tablePO.getTable_name(), FileNameEnumType.FORM_NAME))
				.append("(").append(attrVOList.get(0).getType()).append("  ")
				.append(attrVOList.get(0).getName().toLowerCase()).append(" ){\n").append("		super() ; \n")
				.append("		this.").append(attrVOList.get(0).getName().toLowerCase()).append(" = ")
				.append(attrVOList.get(0).getName().toLowerCase()).append(" ;\n").append("	} \n");
		str.append(" public ").append(formName).append("( ").append(poName).append(" po){ \n ")
				.append(" if (null != po) { \n ").append(" try { \n")
				.append(" BeanUtils.copyProperties(po, this, false); \n").append(" } catch (Exception e) { \n")
				.append(" e.printStackTrace(); \n ")
				.append(" } \n").append("}\n").append("} \n ");
		return str.toString();
	}

	public static String convertToPO(String poName) {
		StringBuilder str = new StringBuilder();
		str.append(" public ").append(poName).append(" convertToPO() { \n ").append("  ").append(poName)
				.append(" po = new ").append(poName).append("(); \n").append(" try { \n ")
				.append(" BeanUtils.copyProperties(this, po, false); \n ").append(" } catch (Exception e) { \n ")
				.append(" e.printStackTrace(); \n ")
				.append(" } \n ").append("return po;\n ").append("} \n");

		return str.toString();
	}

//	public static String addValidate(String formName) {
//		StringBuilder str = new StringBuilder();
//		str.append("public boolean addValidate(ResInfo<").append(formName).append("> resInfo) { \n ")
//				.append(" resInfo.setCode(ResInfoCode.RIC_FAIL); \n")
//
//				.append(" return true; \n ").append(" } \n ");
//		return str.toString();
//	}
//
//	public static String updateValidate(String formName) {
//		StringBuilder str = new StringBuilder();
//		str.append("public boolean updateValidate(<").append(formName).append("> resInfo) { \n ")
//				.append(" resInfo.setCode(ResInfoCode.RIC_FAIL); \n")
//
//				.append(" return true; \n ").append(" } \n ");
//		return str.toString();
//	}

	public static String toString(String formName) {
		StringBuilder str = new StringBuilder();
		str.append("@Override \n ")
		.append("public String toString() { \n ")
		.append("return \"").append(formName).append(":\"+JackJsonUtil.objToJson(this); \n ")
		.append(" } \n ");
		return str.toString();
	}
}
